Learn in 10 minutes

Learn in 10 minutes

تعلم روبي في 10 دقائق

لغة برمجة

روبي هي لغة برمجة ديناميكية موجهة للكائنات معروفة بتركيبها الأنيق وميزاتها الصديقة للمطورين. يغطي هذا البرنامج التعليمي المفاهيم الأساسية لروبي لمساعدتك على تعلم اللغة بسرعة.

1. كتابة أول برنامج روبي

لنبدأ ببرنامج بسيط. أنشئ ملفًا باسم hello.rb وأدخل الكود التالي:

puts "Hello, World!"

احفظ الملف وقم بتشغيل الأمر التالي في الطرفية:

ruby hello.rb

سيكون الناتج:

Hello, World!

هذا البرنامج البسيط يوضح وظيفة الإخراج الأساسية في روبي. تُستخدم الدالة puts لعرض المعلومات النصية في وحدة التحكم.

2. التركيب الأساسي

تركيب روبي نظيف وقابل للقراءة، مصمم ليكون طبيعيًا وبديهيًا.

# هذا تعليق
puts "Hello, World!"

القواعد الأساسية للتركيب في روبي:

  • التعليقات: تبدأ التعليقات ذات السطر الواحد بـ #، بينما تستخدم التعليقات متعددة الأسطر =begin و =end.
  • الجمل: عادةً جملة واحدة لكل سطر، لا حاجة لفاصلة منقوطة ; في النهاية.
  • كتل الكود: تُحدد بـ do...end أو الأقواس المعقوفة {}.
  • استدعاءات الدوال: الأقواس اختيارية لاستدعاءات الدوال بدون وسائط.

مثال مع التعليقات متعددة الأسطر:

=begin
هذا تعليق متعدد الأسطر،
يمتد عبر عدة أسطر.
=end

3. المتغيرات وأنواع البيانات

في روبي، المتغيرات ذات نوع ديناميكي ولا تتطلب إعلانات نوع صريحة.

قواعد تسمية المتغيرات الأساسية:

  • يمكن أن تحتوي أسماء المتغيرات على أحرف وأرقام وشرطات سفلية فقط.
  • لا يمكن أن تبدأ أسماء المتغيرات برقم.
  • أسماء المتغيرات حساسة لحالة الأحرف.
  • لا يمكن استخدام كلمات روبي المحجوزة كأسماء متغيرات.

أنواع البيانات الأساسية الرئيسية في روبي هي:

  • عدد صحيح (Integer): مثل 42 أو -10.
  • عدد عشري (Float): مثل 3.14 أو 2.5e3.
  • سلسلة نصية (String): مثل "hello" أو 'world'، باستخدام علامات تنصيص مفردة أو مزدوجة.
  • منطقي (Boolean): true أو false.
  • لا شيء (Nil): يمثله nil، يشير إلى قيمة فارغة أو لا شيء.
  • رمز (Symbol): مثل :name، معرفات غير قابلة للتغيير.

3.1 الأنواع العددية

تدعم روبي الأعداد الصحيحة والأعداد العشرية.

# عدد صحيح
age = 25
population = 1_000_000  # شرطات سفلية لسهولة القراءة

# عدد عشري
temperature = 36.5
pi = 3.14159

# عمليات
puts 10 + 5   # 15
puts 10 / 3   # 3 (قسمة صحيحة)
puts 10.0 / 3 # 3.333... (قسمة عشرية)

3.2 السلسلة النصية

السلاسل النصية هي تسلسلات من الأحرف، محاطة بعلامات تنصيص مفردة أو مزدوجة.

single_quote = 'سلسلة نصية بعلامات تنصيص مفردة'
double_quote = "سلسلة نصية بعلامات تنصيص مزدوجة"
multiline = "هذه سلسلة نصية
متعددة الأسطر"

# إقحام السلسلة (فقط في علامات التنصيص المزدوجة)
name = "أليس"
greeting = "مرحبًا، #{name}!"
puts greeting  # "مرحبًا، أليس!"

عمليات السلسلة النصية:

text = "برمجة روبي"
puts text.length        # طول السلسلة
puts text.upcase        # تحويل إلى أحرف كبيرة
puts text.downcase      # تحويل إلى أحرف صغيرة
puts text[0]            # الوصول إلى الحرف الأول
puts text[0..3]         # تقطيع السلسلة
puts text.include?("روبي")  # التحقق من الوجود

3.3 النوع المنطقي

النوع المنطقي له قيمتان: true و false.

is_active = true
is_complete = false

# العمليات المنطقية
result1 = true && false  # false
result2 = true || false  # true
result3 = !true          # false

3.4 النوع لا شيء

nil يمثل حالة فارغة أو بدون قيمة.

value = nil

if value.nil?
  puts "القيمة فارغة"
end

3.5 الرمز

الرموز هي معرفات غير قابلة للتغيير، غالبًا ما تُستخدم كمفاتيح في الهاشات.

:name
:email
:created_at

# الرموز مقابل السلاسل النصية
puts :name.object_id == :name.object_id  # true (نفس الكائن)
puts "name".object_id == "name".object_id  # false (كائنات مختلفة)

4. هياكل البيانات

توفر روبي عدة هياكل بيانات مدمجة لتخزين ومعالجة البيانات.

4.1 المصفوفة

المصفوفة هي مجموعة مرتبة يمكنها احتواء قيم متعددة.

numbers = [1, 2, 3, 4, 5]
numbers.push(6)        # إضافة عنصر
numbers.unshift(0)     # إدراج في البداية
numbers.delete(3)      # إزالة قيمة محددة
numbers[0] = 10        # تعديل عنصر
puts numbers.inspect   # [10, 2, 4, 5, 6]

عمليات المصفوفة:

numbers = [10, 20, 30, 40, 50]
puts numbers[1..3]     # [20, 30, 40]
puts numbers.first     # 10
puts numbers.last      # 50
puts numbers.include?(30)  # true

4.2 الهاش

الهاش هو مجموعة من أزواج المفتاح-القيمة، مشابه للقواميس في اللغات الأخرى.

student = {
  name: "جون",
  age: 20,
  major: "علوم الحاسوب"
}

# الوصول إلى الهاش وتعديله
puts student[:name]
student[:age] = 21
student[:gpa] = 3.8

# التكرار عبر الهاش
student.each do |key, value|
  puts "#{key}: #{value}"
end

5. التحكم في التدفق

توفر روبي عدة جمل للتحكم في التدفق لإدارة تنفيذ البرنامج.

5.1 جمل if

تقيِّم جملة if شرطًا وتنفذ كتلتها إذا كان الشرط صحيحًا.

age = 20
if age >= 18
  puts "بالغ"
elsif age >= 13
  puts "مراهق"
else
  puts "طفل"
end

# if بسطر واحد
puts "بالغ" if age >= 18

5.2 جمل unless

unless هو عكس if - ينفذ عندما يكون الشرط خاطئًا.

age = 15
unless age >= 18
  puts "ليس بالغًا"
end

# unless بسطر واحد
puts "ليس بالغًا" unless age >= 18

5.3 جمل case

توفر جمل case طريقة نظيفة للتعامل مع شروط متعددة.

grade = "B"

case grade
when "A"
  puts "ممتاز"
when "B"
  puts "جيد"
when "C"
  puts "متوسط"
else
  puts "بحاجة للتحسين"
end

5.4 الحلقات

تدعم روبي عدة تركيبات للحلقات.

حلقة while:

count = 0
while count < 5
  puts count
  count += 1
end

حلقة until:

count = 0
until count >= 5
  puts count
  count += 1
end

حلقة for:

for i in 0..4
  puts i
end

المكرر each:

(0..4).each do |i|
  puts i
end

# مع المصفوفات
fruits = ["تفاح", "موز", "كرز"]
fruits.each do |fruit|
  puts fruit
end

break و next:

(0..9).each do |i|
  break if i == 5     # الخروج من الحلقة
  next if i % 2 == 0  # تخطي الأعداد الزوجية
  puts i              # الناتج: 1, 3
end

6. الدوال

تُعرَّف الدوال في روبي باستخدام الكلمة المفتاحية def.

تعريف الدالة الأساسي:

def greet(name)
  "مرحبًا، #{name}!"
end

# استدعاء الدالة
message = greet("جون")
puts message

المعاملات الافتراضية:

def greet(name, greeting = "مرحبًا")
  "#{greeting}, #{name}!"
end

puts greet("أليس")          # "مرحبًا، أليس!"
puts greet("بوب", "أهلاً")      # "أهلاً، بوب!"

معاملات متغيرة:

def sum_numbers(*numbers)
  numbers.sum
end

puts sum_numbers(1, 2, 3, 4)  # 10

معاملات الكلمة المفتاحية:

def create_person(name:, age:, city: "غير معروف")
  { name: name, age: age, city: city }
end

person = create_person(name: "أليس", age: 25)
puts person.inspect

7. الكتل و Procs

الكتل هي أجزاء من الكود يمكن تمريرها إلى الدوال.

استخدام الكتل:

# استخدام do...end
3.times do
  puts "مرحبًا!"
end

# استخدام الأقواس المعقوفة
3.times { puts "مرحبًا!" }

# كتل بمعاملات
(1..3).each do |number|
  puts "الرقم: #{number}"
end

كلمة yield المفتاحية:

def run_block
  puts "قبل الكتلة"
  yield
  puts "بعد الكتلة"
end

run_block { puts "داخل الكتلة" }

Procs:

Procs هي كائنات تغلف الكتل.

square = Proc.new { |x| x * x }
puts square.call(5)  # 25

# تمرير Procs إلى الدوال
def apply_operation(numbers, operation)
  numbers.map { |n| operation.call(n) }
end

numbers = [1, 2, 3, 4]
squares = apply_operation(numbers, square)
puts squares.inspect  # [1, 4, 9, 16]

8. الفئات والكائنات

روبي هي لغة موجهة للكائنات بحتة حيث كل شيء هو كائن.

تعريف الفئة الأساسي:

class Person
  def initialize(name, age)
    @name = name
    @age = age
  end

  def introduce
    "أنا #{@name}، عمري #{@age} سنة"
  end

  def have_birthday
    @age += 1
    "#{@name} احتفل بعيد ميلاده، عمره الآن #{@age} سنة"
  end
end

# إنشاء الكائنات
person1 = Person.new("جون", 25)
person2 = Person.new("جين", 30)

puts person1.introduce
puts person2.have_birthday

دوال الوصول:

class Person
  attr_reader :name    # وصول للقراءة
  attr_writer :age     # وصول للكتابة
  attr_accessor :city  # وصول للقراءة والكتابة

  def initialize(name, age, city)
    @name = name
    @age = age
    @city = city
  end
end

person = Person.new("أليس", 25, "نيويورك")
puts person.name      # "أليس"
person.age = 26       # تعيين العمر
person.city = "بوسطن" # تعيين المدينة
puts person.city      # "بوسطن"

دوال الفئة والمتغيرات:

class Student
  @@student_count = 0  # متغير الفئة

  def initialize(name)
    @name = name
    @@student_count += 1
  end

  def self.student_count  # دالة الفئة
    @@student_count
  end
end

student1 = Student.new("جون")
student2 = Student.new("جين")
puts Student.student_count  # 2

التوريث:

class Animal
  def initialize(name)
    @name = name
  end

  def speak
    "#{@name} يصدر صوتًا"
  end
end

class Dog < Animal
  def speak
    "#{@name} ينبح"
  end
end

class Cat < Animal
  def speak
    "#{@name} يموء"
  end
end


dog = Dog.new("باددي")
cat = Cat.new("ميمي")

puts dog.speak  # "باددي ينبح"
puts cat.speak  # "ميمي يموء"

9. الوحدات و Mixins

تُستخدم الوحدات لتجميع الدوال والثوابت المرتبطة، ويمكن مزجها في الفئات.

تعريف الوحدة:

module Speakable
  def speak
    "#{@name} يقول شيئًا"
  end
end

class Person
  include Speakable

  def initialize(name)
    @name = name
  end
end

person = Person.new("أليس")
puts person.speak  # "أليس يقول شيئًا"

تسمية النطاقات باستخدام الوحدات:

module Math
  PI = 3.14159

  def self.square(x)
    x * x
  end
end

puts Math::PI        # 3.14159
puts Math.square(5)  # 25

10. معالجة الاستثناءات

توفر روبي معالجة قوية للاستثناءات باستخدام begin، rescue، ensure، و raise.

معالجة الاستثناءات الأساسية:

begin
  result = 10 / 0
rescue ZeroDivisionError => e
  puts "لا يمكن القسمة على صفر: #{e.message}"
else
  puts "القسمة ناجحة"
ensure
  puts "هذا يعمل دائمًا"
end

رفع الاستثناءات:

def divide(a, b)
  raise "لا يمكن القسمة على صفر" if b == 0
  a / b
end

begin
  result = divide(10, 0)
rescue => e
  puts "خطأ: #{e.message}"
end

11. عمليات الملفات

توفر روبي طرقًا بسيطة لقراءة وكتابة الملفات.

قراءة الملفات:

# قراءة الملف بالكامل
content = File.read("example.txt")
puts content

# قراءة سطر بسطر
File.foreach("example.txt") do |line|
  puts line.chomp
end

كتابة الملفات:

# الكتابة إلى ملف
File.write("output.txt", "مرحبًا، روبي!\n")

# الإضافة إلى ملف
File.open("output.txt", "a") do |file|
  file.puts "إضافة محتوى جديد."
end

12. الدوال المدمجة المفيدة

تأتي روبي مع العديد من الدوال المدمجة المفيدة.

دوال السلسلة النصية:

text = "  برمجة روبي  "
puts text.strip        # إزالة المسافات البيضاء
puts text.split(" ")   # تقسيم إلى مصفوفة
puts text.gsub("روبي", "بايثون")  # استبدال

دوال المصفوفة:

numbers = [3, 1, 4, 1, 5, 9, 2]
puts numbers.sort.inspect      # [1, 1, 2, 3, 4, 5, 9]
puts numbers.uniq.inspect      # [3, 1, 4, 5, 9, 2]
puts numbers.select { |n| n > 3 }.inspect  # [4, 5, 9]

دوال الهاش:

person = { name: "أليس", age: 25, city: "نيويورك" }
puts person.keys.inspect    # [:name, :age, :city]
puts person.values.inspect  # ["أليس", 25, "نيويورك"]
puts person.has_key?(:age)  # true

13. جيمات روبي

RubyGems هو مدير الحزم في روبي لتثبيت وإدارة المكتبات.

تثبيت الجيمات:

gem install rails

استخدام الجيمات في الكود:

require 'json'

# تحليل JSON
json_string = '{"name": "Alice", "age": 25}'
person = JSON.parse(json_string)
puts person["name"]  # "Alice"

# توليد JSON
person_hash = { name: "Bob", age: 30 }
json_output = JSON.generate(person_hash)
puts json_output  # {"name":"Bob","age":30}

14. دليل نمط روبي

لدى روبي دليل نمط مجتمعي قوي يشجع على كتابة كود نظيف وقابل للقراءة.

المسافات البادئة: استخدم مسافتين للمسافات البادئة.

اتفاقيات التسمية:

  • المتغيرات والدوال: snake_case
  • الفئات والوحدات: CamelCase
  • الثوابت: SCREAMING_SNAKE_CASE

الأقواس: استخدم الأقواس لاستدعاءات الدوال ذات المعاملات، احذفها لاستدعاءات الدوال بدون معاملات.

الكتل: استخدم do...end للكتل متعددة الأسطر، {} للكتل ذات السطر الواحد.

يجعل تركيب روبي الأنيق وميزاته القوية العمل معه ممتعًا. جعل تركيزه على سعادة المطور والإنتاجية شائعًا في تطوير الويب، والبرمجة النصية، ومهام الأتمتة.